// 第二类斯特林数 斯特林子集数
// 将 n 个不同元素，划分为 m 个非空子集的方案数，记作 S[n][m]
// S[0][0] = 1, S[i][0] = 0
// 递推式 ：S[i][j] = S[i - 1][j - 1] + j * S[i - 1][j]
// 将 n 只小猪安置在 m 个房间且没有房间空闲的方案数
// 1 <= n <= 50，0 <= m <= 50
// 测试链接 ：https://www.luogu.com.cn/problem/P3904
// 相关帖子 ：https://www.cnblogs.com/dx123/p/17024548.html
// 相关帖子 ：https://oi-wiki.org/math/combinatorics/stirling/
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 55;
// L[i][j] 表示斯特林数 S[i][j] 的位数 
int S[MAXN][MAXN][100], L[MAXN][MAXN];

void add(int x, int y)
{
    L[x][y] = max(L[x - 1][y - 1], L[x - 1][y]);
    for(int i = 0; i < L[x][y]; ++i)
    {
        S[x][y][i] += S[x - 1][y - 1][i] + y * S[x - 1][y][i];
        S[x][y][i + 1] += S[x][y][i] / 10;
        S[x][y][i] %= 10;
    }
    while(S[x][y][L[x][y]])
    {
        S[x][y][L[x][y] + 1] += S[x][y][L[x][y]] / 10;
        S[x][y][L[x][y]] %= 10;
        ++L[x][y];
    }
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    S[0][0][0] = 1, L[0][0] = 1;
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= i; ++j)
        {
            add(i, j);
        }
    }
    if(!L[n][m]) puts("0"); // n < m
    for(int i = L[n][m] - 1; i >= 0; --i) printf("%d", S[n][m][i]);

    return 0;
}